﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using RzCorportativo.DataAccess;

namespace RzCorportativo.Lib
{
    public class Endereco
    {
        public int EnderecoId { get; set; }
        public string Logradouro { get; set; }
        public string Numero { get; set; }
        public string Cep { get; set; }
        public int CidadeId { get; set; }
        public Uf Uf { get; set; }
        public bool IsNew { get { return this.EnderecoId == 0; } }
        public Cidade Cidade { get; set; }
        private RzCorportativo.DataAccess.Endereco model;

        public bool Salvar()
        {
            bool @result = false;
            Transaction.Begin((entity) =>
            {
                if (this.IsNew)
                    this.model = this.Insert(entity);
                else
                    this.model = this.Update(entity);
                return true;
            }).OnError((ex) =>
            {
                @result = false;
            }).OnSuccess(() =>
            {
                @result = true;
                this.EnderecoId = this.model.EnderecoId;
            });
            return @result;
        }

        private RzCorportativo.DataAccess.Endereco Insert(SistemaCurricularEntities entity)
        {
            var @item = this.CreateModel(entity);
            entity.AddToEndereco(@item);
            return @item;
        }

        private RzCorportativo.DataAccess.Endereco Update(SistemaCurricularEntities entity)
        {
            var @item = this.CreateModel(entity);
            return @item;
        }

        private RzCorportativo.DataAccess.Endereco CreateModel(SistemaCurricularEntities entity)
        {
            var endereco = new RzCorportativo.DataAccess.Endereco();
            if (!this.IsNew)
            {
                endereco = entity.Endereco.Where(w => w.EnderecoId == this.EnderecoId).FirstOrDefault();
                if (endereco == null)
                    throw new Exception("Código inválido");
            }

            endereco.EnderecoId = this.EnderecoId;
            endereco.Logradouro = this.Logradouro;
            endereco.Numero = this.Numero;
            endereco.Cep = this.Cep;
            endereco.CidadeId = this.CidadeId;
            
            return endereco;
        }

        internal Endereco CreateEndereco(RzCorportativo.DataAccess.Endereco item)
        {
            if (item == null)
                return null;
            Endereco endereco = new Endereco();
            endereco.EnderecoId = item.EnderecoId;
            endereco.Logradouro = item.Logradouro;
            endereco.Numero = item.Numero;
            endereco.Cep = item.Cep;
            endereco.CidadeId = item.CidadeId;
            endereco.Cidade = new Cidade().CreateCidade(item.Cidade);
            return endereco;
        }

        public static List<Lib.Endereco> Listar(Lib.Endereco endereco)
        {
            if (endereco == null)
                endereco = new Lib.Endereco();
            List<Lib.Endereco> enderecos = new List<Lib.Endereco>();
            var db = new SistemaCurricularEntities();
            
            enderecos = db.Endereco.Where(w =>
                    ((endereco.EnderecoId == 0) || (endereco.EnderecoId == w.EnderecoId)) &&
                    ((endereco.Logradouro == null || endereco.Logradouro == "") || (w.Logradouro.Contains(endereco.Logradouro))) &&
                    ((endereco.Cep == null || endereco.Cep == "") || (endereco.Cep == w.Cep)) &&
                    ((endereco.CidadeId == 0) || (endereco.CidadeId == w.CidadeId))
                ).ToList().Select(s => endereco.CreateEndereco(s)).ToList();
            return enderecos;
        }

    }
}
